package com.github.cakin.shiro.chapter17.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.stereotype.Service;

import static com.github.cakin.shiro.chapter17.Constants.NUM3600;

/**
 * @className: OAuthService
 * @description: OAuthServiceImpl 服务，进行 auth code 和 access token 的维护
 * @date: 2020/5/27
 * @author: cakin
 */
@Service
public class OAuthServiceImpl implements OAuthService {
    /**
     * 缓存
     */
    private Cache cache;
    /**
     * 注入客户端服务
     */
    @Autowired
    private ClientService clientService;

    /**
     * 功能描述：初始化缓存
     *
     * @param cacheManager 缓存管理器
     * @author cakin
     * @date 2020/5/27
     */
    @Autowired
    public OAuthServiceImpl( CacheManager cacheManager ) {
        this.cache = cacheManager.getCache("code-cache");
    }

    /**
     * 功能描述：添加 auth code，将数据放到缓存
     *
     * @param authCode 授权码
     * @param username 用户名
     * @author cakin
     * @date 2020/5/27
     */
    public void addAuthCode( String authCode, String username ) {
        cache.put(authCode, username);
    }

    /**
     * 功能描述：添加 access token，将数据放到缓存
     *
     * @param accessToken 访问码
     * @param username    用户名
     * @author cakin
     * @date 2020/5/27
     */
    public void addAccessToken( String accessToken, String username ) {
        cache.put(accessToken, username);
    }

    /**
     * 功能描述：根据auth code获取用户名，从缓存取
     *
     * @param authCode 授权码
     * @return String 用户名
     * @author cakin
     * @date 2020/5/27
     */
    public String getUsernameByAuthCode( String authCode ) {
        return (String) cache.get(authCode).get();
    }

    /**
     * 功能描述：根据access token获取用户名，从缓存取
     *
     * @param accessToken 访问码
     * @return String 用户名
     * @author cakin
     * @date 2020/5/27
     */
    public String getUsernameByAccessToken( String accessToken ) {
        return (String) cache.get(accessToken).get();
    }

    /**
     * 功能描述：验证auth code是否有效，判断缓存是否存在
     *
     * @param authCode 授权码
     * @return boolean 返回值
     * @author cakin
     * @date 2020/5/27
     */
    public boolean checkAuthCode( String authCode ) {
        return cache.get(authCode) != null;
    }

    /**
     * 功能描述：验证access token是否有效，判断缓存是否存在
     *
     * @param accessToken 访问码
     * @return boolean 返回值
     * @author cakin
     * @date 2020/5/27
     */
    public boolean checkAccessToken( String accessToken ) {
        return cache.get(accessToken) != null;
    }

    /**
     * 功能描述：检查客户端id是否存在
     *
     * @param clientId 客户端Id
     * @return boolean
     * @author cakin
     * @date 2020/5/27
     */
    public boolean checkClientId( String clientId ) {
        return clientService.findByClientId(clientId) != null;
    }

    /**
     * 功能描述：坚持客户端安全KEY是否存在
     *
     * @param clientSecret 客户端安全KEY
     * @return boolean
     * @author cakin
     * @date 2020/5/27
     */
    public boolean checkClientSecret( String clientSecret ) {
        return clientService.findByClientSecret(clientSecret) != null;
    }

    /**
     * 功能描述：auth code / access token 过期时间
     *
     * @return long 过期时间
     * @author cakin
     * @date 2020/5/27
     */
    public long getExpireIn() {
        return NUM3600;
    }
}
